const express = require('express')

const app = express()

const mw = function (req, res, next) {
  console.log('中间件函数');
  // 把流转关系交给下一个中间件，或者路由
  next()
}

// 路由之前注册中间件， 中间件执行顺序由数组顺序执行。全局中间件直接通过app.use()注册。
// 局部中间件在指定路由中右参数传递，每个中间件必须有next()
// 规范
// 调用next()后不要写其他代码
// 多个中间件中，共享req和res对象
/** 
 * 1.通过app.use()，或者app.get，app.post,绑定到app实例上的中间件，叫做应用级别的中间件
 * 2.绑定到express.Router实例上的中间件，叫做路由级别的中间件
 * 3.错误级别的中间件，专门用来捕获整个项目中发生的异常错误，防止项目崩溃
 * 4. Express内置中间件
*/
const mw2 = (req, res, next) => {
  console.log('第二个中间件');
  next()
}
// 全局中间件
app.use(mw)
app.listen('80', (req, res) => {
  console.log('12312321331');
})
// 局部中间件
app.get('/', [mw2, mw], (req, res) => {
  res.send('1231231')
})

app.get('/user', (req, res) => {
  // 抛出错误
  throw new Error('错误')
  res.send('userList')
})
// 错误级别中间件
app.use((err, req, res, next) => {
  console.log('错误' + err.message);
  // 发送错误信息
  res.send('Error' + err.message)
})

// 内置中间件
// 快速托管静态资源的内置中间件
app.use(express.static())
// 解析JSON格式的请求体数据(4.16.0+)
app.use(express.json())
// 解析url-encoded格式请求体数据(4.16.0+)
app.use(express.unlencoded({ extended: false }))